package com.wei.czz.common.enums;

import com.wei.czz.common.dto.common.NameValue;
import lombok.AllArgsConstructor;
import lombok.Getter;

import java.util.*;
import java.util.function.Function;

/**
 * Created by IntelliJ IDEA.
 *
 * @author wei
 * date: 2022-08-17 22:13:43
 * className: CommonEnum 全局公共枚举类
 * version: 1.0
 * description:
 */
@Getter
@AllArgsConstructor
public enum CommonEnum {

    MINUS_ONE(-1, "负一"), ZERO(0, "零"), ONE(1, "一"), TWO(2, "二"),
    THREE(3, "三"),
    ;

    /**
     * 字典值
     */
    private final Integer value;

    /**
     * 字典值的描述信息
     */
    private final String name;

    public Long getLongValue() {
        return (long) value;
    }

    public String getStringValue() { return value.toString(); }

    /**
     * 校验字典状态属性值是否正确
     * @param status 待校验的值
     * @return true-校验拒绝 false-校验通过
     */
    public static boolean isStatusFail(Integer status) {
        for (CommonEnum dict : new CommonEnum[] { ZERO, ONE }) {
            if (dict.value.equals(status)) {
                return false;
            }
        }
        return true;
    }

    /**
     * 校验参数值是否为默认主键
     * @param value 待校验的值
     * @return true-是 false-不是
     */
    public static boolean isDefaultId(Long value) {
        return ZERO.getLongValue().equals(value);
    }

    /**
     * 匹配状态枚举对象
     * @param value 参数值
     * @return 状态枚举对象
     */
    public static CommonEnum getStatusEnum(Integer value) {
        if (ZERO.value.equals(value)) {
            return ZERO;
        }
        if (ONE.value.equals(value)) {
            return ONE;
        }
        return null;
    }

    /**
     * 获取状态名称
     * @param value 值
     * @return 名称
     */
    public static String getStatusName(Integer value) {
        if (ZERO.value.equals(value)) {
            return "可用";
        }  else if (ONE.value.equals(value)) {
            return "不可用";
        } else {
            return "";
        }
    }

    /**
     * 获取状态枚举列表
     */
    public static List<NameValue<Integer>> getStatusList() {
        List<NameValue<Integer>> statusList = new ArrayList<>(2);
        statusList.add(new NameValue<>("可用", ZERO.getValue()));
        statusList.add(new NameValue<>("不可用", ONE.getValue()));
        return statusList;
    }

    /**
     * 获取状态枚举映射
     */
    public static Map<Integer, String> getStatusMap() {
        Map<Integer, String> statusMap = new HashMap<>();
        statusMap.put(ZERO.getValue(), "可用");
        statusMap.put(ONE.getValue(), "不可用");
        return statusMap;
    }

    /**
     * 过滤数据库存储的默认值
     * @param value 参数值
     * @return 结果
     */
    public static <V> V filterDefault(V value) {
        if (value instanceof Long && Long.valueOf(MINUS_ONE.value).equals(value)) {
            return null;
        }
        if (value instanceof Integer && MINUS_ONE.value.equals(value)) {
            return null;
        }
        return value;
    }

    /**
     * 过滤数据库存储的默认值
     * @param value 参数值
     * @return 结果
     */
    public static <V, T> T filterDefault(V value, Function<V, T> function) {
        if (value instanceof Long && Long.valueOf(MINUS_ONE.value).equals(value)) {
            return null;
        }
        if (value instanceof Integer && MINUS_ONE.value.equals(value)) {
            return null;
        }
        return function.apply(value);
    }

    /**
     * 获取删除状态名称
     * @param deleteStatus 删除状态
     * @return 删除状态名称
     */
    public static Object getName(Integer deleteStatus) {
        if (Objects.isNull(deleteStatus)) {
            return "";
        }
        CommonEnum[] commonEnums = { ZERO, ONE };
        for (CommonEnum commonEnum : commonEnums) {
            if (commonEnum.value.equals(deleteStatus)) {
                return commonEnum.name;
            }
        }
        return "";
    }

}
